﻿Imports BL.BL
Imports BE.BE
Imports System.Threading
Imports System.Globalization


Public Class frmlogin

#Region "Atributos"

    Dim mintegridad As Boolean
    Dim mConexion As Boolean
    Dim mAutenticado As Integer
    Dim mIntentosFallidos As Integer


#End Region


#Region "Métodos"


    Private Sub frmlogin_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        'defino el lenguage de la aplicacion para el guardado de datos en la base de datos.
        Thread.CurrentThread.CurrentCulture = New CultureInfo("es-AR")
        Thread.CurrentThread.CurrentUICulture = New CultureInfo("es-AR")

        'verificación str conexión a la BD. (Hacer)
        Me.mConexion = False
        Try
            'verificar string connection a DB.
        Catch ex As Exception

        End Try


        'al ingresar al sistema se verifican los dvh y dvv de las tablas que los contienen.
        'de encontrarse ante una falla de seguridad, sólo el usuario administrador del sistema puede entrar al sistema.
        mintegridad = True
        'le pasamos (login=true) para que al verificar y encontrar errores de integridad no de la opción de corregirlos en el momento.
        Try
            If Helper_BL.chequearDV(True) = False Then
                'hay un fallo de integridad en la BD.
                'sólo se admitirá el login del administrador del sistema (suseas).
                mintegridad = False
                MsgBox("Existe un fallo de integridad en la Base de Datos, por favor contacté al Administrador del Sistema SEAS..", MsgBoxStyle.Exclamation, "")
                'se grabar en bitacora el error de integridad cuando se loguue el administrador del sistema.
            End If
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
        

        'variables iniciales.
        Me.mAutenticado = False
        Me.mIntentosFallidos = 0
        'cosmetica.
        Me.txtNick.Text = ""
        Me.txtNick.Focus()
        Me.txtPassword.Text = ""

    End Sub


    Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click

        'variables para la carga en bitácora.
        Dim tmov As New TipoMovimiento_BE
        Dim usr As New Usuario_BE

        'verificamos si estamos en el caso de error de integridad en la BD
        If mintegridad = False Then
            'ERROR DE INTEGRIDAD EN LA BASE.
            'sólo puede ingresar el administrador del sistema.
            If Me.txtNick.Text <> "suseas" Then
                MsgBox("Sólo puede ingresar el administrador del sistema SEAS..  hay un error de Integridad en la Base de Datos..", MsgBoxStyle.Exclamation, "")
                'cosmetica.
                Me.txtNick.Text = ""
                Me.txtNick.Focus()
                Me.txtPassword.Text = ""
                Exit Sub
            End If
        End If

        'NO HAY ERROR DE INTEGRIDAD EN LA BASE.
        'verificamos existencia de nick, si esta bloqueado y si el password es correcto.
        'no existe nick = 0
        'nick ok, usuario bloqueado = 1
        'nick ok, bad pasword = 2
        'nick ok, password ok = 3
        'nick ok, usuario desbloqueado, pide new password ingresando previamente la password aleatoria enviada por email = 4
        Try
            mAutenticado = Usuario_BL.consultarNickPasswordUBloqueado(Me.txtNick.Text, Me.txtPassword.Text)
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try



        Select Case mAutenticado

            Case 0

                'no existe nick ingresado.
                MessageBox.Show("Usuario/Clave incorrectos..")
                Me.txtNick.Text = ""
                Me.txtNick.Focus()
                Me.txtPassword.Text = ""
                Exit Sub

            Case 1

                'bloqueado.
                MessageBox.Show("Usuario Bloqueado.. Contacte al Administrador del Sistema SEAS..")
                Try
                    usr = Usuario_BL.traerUsuario(Me.txtNick.Text)
                Catch ex As Exception
                    MsgBox(ex.ToString)
                End Try

                'grabar en bitacora.
                tmov.mDescripcion = "Usuario Bloqueado intentó ingresar al Sistema.."
                tmov.mCriticidad = 1
                Try
                    Bitacora_BL.grabarEnBitacora(usr, tmov)
                Catch ex As Exception
                    MsgBox(ex.ToString)
                End Try

                'çosmetica.
                Me.txtNick.Text = ""
                Me.txtNick.Focus()
                Me.txtPassword.Text = ""
                Exit Sub

            Case 2

                'error en password
                If Me.txtNick.Text <> "suseas" Then
                    'obtenemos de la DB los intentos incorrectos de este nick.
                    Try
                        usr = Usuario_BL.traerUsuario(Me.txtNick.Text)
                    Catch ex As Exception
                        MsgBox(ex.ToString)
                    End Try
                    'actualizamos contador intentos fallidos.
                    Me.mIntentosFallidos = usr.intentosfallidos
                    Me.mIntentosFallidos = Me.mIntentosFallidos + 1
                    usr.intentosfallidos = Me.mIntentosFallidos
                    Try
                        Usuario_BL.grabarIntentosIncorrectosUsuario(usr)
                    Catch ex As Exception
                        MsgBox(ex.ToString)
                    End Try

                    If mIntentosFallidos > 2 Then
                        Try
                            Usuario_BL.bloquearUsuario(Me.txtNick.Text)
                        Catch ex As Exception
                            MsgBox(ex.ToString)
                        End Try

                        MessageBox.Show("Excedió la cantidad de intentos incorrectos, Usuario/Nick Bloqueado.. Contacte al Administrador del Sistema SEAS..")
                        'grabar en bitacora.
                        tmov.mDescripcion = "usuario Bloqueado por exceso de claves incorrectas"
                        tmov.mCriticidad = 1
                        Try
                            Bitacora_BL.grabarEnBitacora(usr, tmov)
                        Catch ex As Exception
                            MsgBox(ex.ToString)
                        End Try

                        'cosmetica.
                        Me.txtNick.Text = ""
                        Me.txtNick.Focus()
                        Me.txtPassword.Text = ""
                        Exit Sub
                    End If

                    'grabar en bitacora.
                    tmov.mDescripcion = "usuario ingresó clave incorrecta"
                    tmov.mCriticidad = 1
                    Try
                        Bitacora_BL.grabarEnBitacora(usr, tmov)
                    Catch ex As Exception
                        MsgBox(ex.ToString)
                    End Try

                End If

                MessageBox.Show("La clave ingresada es incorrecta..")
              
                'cosmetica.
                Me.txtPassword.Text = ""
                Me.txtPassword.Focus()
                Exit Sub

            Case 3

                'ok
                'ya se validó antes la existencia del usuario.
                Try
                    usr = Usuario_BL.traerUsuario(Me.txtNick.Text)
                Catch ex As Exception
                    MsgBox(ex.ToString)
                End Try


                'resetamos el contador de intentos fallidos.
                If Me.txtNick.Text <> "suseas" Then
                    usr.intentosfallidos = 0
                    Try
                        Usuario_BL.grabarIntentosIncorrectosUsuario(usr)
                    Catch ex As Exception
                        MsgBox(ex.ToString)
                    End Try
                End If

                'grabar en bitacora.
                If mintegridad = False Then
                    tmov.mDescripcion = "usuario Administrador ingresó al sistema con problemas de integridad en la Base de Datos"
                    tmov.mCriticidad = 0
                    Try
                        Bitacora_BL.grabarEnBitacoraCasoFallaIntegridad(usr, tmov)
                    Catch ex As Exception
                        MsgBox(ex.ToString)
                    End Try
                Else
                    tmov.mDescripcion = "usuario ingresó al sistema"
                    tmov.mCriticidad = 2
                    Try
                        Bitacora_BL.grabarEnBitacora(usr, tmov)
                    Catch ex As Exception
                        MsgBox(ex.ToString)
                    End Try
                End If
               

                'ventana login invisible.
                Me.Visible = False

                'pasamos al frm principal los datos básicos del usuario loqgueado, el estado de integridad de la base, las patentes se cargan en el frmprincipal.
                frmPrincipal.usr = usr
                frmPrincipal.integridad = mintegridad
                frmPrincipal.Text = "SEAS - (" & usr.nick & ")  " & usr.apellido & ", " & usr.nombre
                frmPrincipal.Show()

            Case 4
                'usuario desbloqueado/clave blanqueada, pide new password ingresando previamente la password aleatoria enviada por email.
                'grabar en bitacora.
                Try
                    usr = Usuario_BL.traerUsuario(Me.txtNick.Text)
                Catch ex As Exception
                    MsgBox(ex.ToString)
                End Try

                tmov.mDescripcion = "usuario cambió su contraseña"
                tmov.mCriticidad = 1
                Try
                    Bitacora_BL.grabarEnBitacora(usr, tmov)
                Catch ex As Exception
                    MsgBox(ex.ToString)
                End Try

                frmCambiarClave.Show()

        End Select

    End Sub


    Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelar.Click
        Me.Close()
        Me.Dispose()
    End Sub


#End Region


#Region "Métodos Auxiliares"

    Private Sub txtPassword_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles txtPassword.KeyPress
        'captura tecla Enter.
        If e.KeyChar = ChrW(Keys.Enter) Then
            Call btnOK_Click(Nothing, Nothing)
        End If
    End Sub


    Private Sub frmlogin_KeyDown(sender As Object, e As KeyEventArgs) Handles MyBase.KeyDown
        If e.KeyCode = Keys.F1 Then
            Help.ShowHelp(Me, Application.StartupPath & "\ayuda_SEAS.chm", "parte1.htm")

        End If
    End Sub


#End Region


End Class
